''''''
'''
魔法方法就是可以给你的类增加魔力的特殊方法，
如果你的对象实现（重载）了这些方法中的某一个，
那么这个方法就会在特殊的情况下被 Python 所调用，
你可以定义自己想要的行为，而这一切都是自动触发的。
它们经常是两个下划线包围来命名的（比如 __init__，__lt__），
Python的魔法方法是非常强大的，所以了解其使用方法也变得尤为重要！
'''


class Person:

    # 初始化魔法方法 ，
    # 在创建实例对象为其赋值时使用
    def __init__(self):
        self.lst = []
        print('执行init')

    # 销毁魔法方法 ，
    # 它是在所有魔法方法结束之后，没有再调用或者引用变量时，他才会生效
    def __del__(self):
        print('最后执行')

    # 实例魔法方法
    # call魔法方法的对象可以使用XXX()的形式被调用，比如说累的实例对象
    def __call__(self, num):
        a, b = 1, 1
        if num <= 2:
            self.lst.append(a)
            self.lst.append(b)
        else:
            for i in range(1, num + 1):
                self.lst.append(a)
                a, b = b, a + b
        return self.lst

    def push(self, new):
        print(new)

    # 实例化魔术方法
    # 当你的类里有这个魔方方法是，最先调用的是这个魔法方法
    def __new__(cls, *args, **kwargs):  # 必须要有一个cls来接当前的类
        print('执行new')
        ret = super().__new__(cls)  # 调用父类的__new__()方法创建对象，并用接收返回值
        return ret  # 将对象返回给person


# person = Person()
# person1 = person
# # print('程序结束了....')
# print(person(15))
# print(person.push('九折水瓶'))

class Person1:

    def __init__(self, name, age):
        self.name = name
        self.age = age
    #
    def __str__(self):
        msg = '年龄是:%s,名字是:%s' % (self.age, self.name)
        return msg

    # 如果没有__str__的时候，就会执行__repr__方法
    # 如果有就不执行__repr__方法。

    # 改变对象的字符串显示
    # 调用你在类里传的值来显示
    def __repr__(self):
        msg = '名字是:%s,年龄是%s' % (self.name, self.age)
        return msg


# person2 = Person1('九折？', 30)
# print(person2)
# # 如果是使用%r作为输出，那么调用的就是__repr__方法
# print('%s' % person2)
# print('%r' % person2)
# # 或者指定这个repr方法调用  repr()方法默认调用__repr__()方法
# print(repr(person2))
print(dir(Person))